home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / CUGUK / C005.ZIP / ASINE.C next >
Text File  |  1990-01-19  |  3KB  |  93 lines

  1. /********************************************************************
  2.  * C Users Group (U.K) C Source Code Library File CUGLIB.005        *
  3.  * Inquiries to: M. Houston, 36 Whetstone Clo. Farquhar Rd.         *
  4.  * Edgbaston, Birmingham B15 2QN ENGLAND                *
  5.  ********************************************************************
  6.  * File name: asine.c
  7.  * Program name: library modules only
  8.  * Source of file: The Public Domain Software Library.
  9.  * Purpose: maths function
  10.  * Changes: <who what when & why major changes have been made>      
  11.  ********************************************************************/
  12.  
  13. /***********************************************************
  14.  *               The TULSA IBM C BOARD                     *
  15.  *                   918-664-8737                          *
  16.  *             300/1200 XMODEM, 24 Hours                   *
  17.  **********************************************************/
  18.  
  19. #include "math.h"
  20. #include "errno.h"
  21.  
  22. double arcsine();
  23.  
  24. double asin(x)
  25. double x;
  26. {
  27.         return arcsine(x,0);
  28. }
  29.  
  30. double acos(x)
  31. double x;
  32. {
  33.         return arcsine(x,1);
  34. }
  35.  
  36. #define P1 -0.27368494524164255994e+2
  37. #define P2 +0.57208227877891731407e+2
  38. #define P3 -0.39688862997504877339e+2
  39. #define P4 +0.10152522233806463645e+2
  40. #define P5 -0.69674573447350646411
  41. #define Q0 -0.16421096714498560795e+3
  42. #define Q1 +0.41714430248260412556e+3
  43. #define Q2 -0.38186303361750149284e+3
  44. #define Q3 +0.15095270841030604719e+3
  45. #define Q4 -0.23823859153670238830e+2
  46.  
  47. #define P(g) ((((P5*g P4)*g P3)*g P2)*g P1)
  48. #define Q(g) (((((g Q4)*g Q3)*g Q2)*g Q1)*g Q0)
  49.  
  50. double arcsine(x,flg)
  51. double x;
  52. {
  53.         double y, g, r;
  54.         register int i;
  55.         extern int errno;
  56.         static double a[2] = { 0.0, 0.78539816339744830962 };
  57.         static double b[2] = { 1.57079632679489661923, 0.78539816339744830962 };
  58.  
  59.         y = fabs(x);
  60.         i = flg;
  61.         if (y < 2.3e-10)
  62.                 r = y;
  63.         else {
  64.                 if (y > 0.5) {
  65.                         i = 1-i;
  66.                         if (y > 1.0) {
  67.                                 errno = EDOM;
  68.                                 return 0.0;
  69.                         }
  70.                         g = (0.5-y)+0.5;
  71.                         g = ldexp(g,-1);
  72.                         y = sqrt(g);
  73.                         y = -(y+y);
  74.                 } else
  75.                         g = y*y;
  76.                 r = y + y*
  77.                                 ((P(g)*g)
  78.                                 /Q(g));
  79.         }
  80.         if (flg) {
  81.                 if (x < 0.0)
  82.                         r = (b[i] + r) + b[i];
  83.                 else
  84.                         r = (a[i] - r) + a[i];
  85.         } else {
  86.                 r = (a[i] + r) + a[i];
  87.                 if (x < 0.0)
  88.                         r = -r;
  89.         }
  90.         return r;
  91. }
  92.  
  93.